今天跟[Day26],我們來學學如何建立segment
。
咦?可能有先進會問segment
誰不會建呀,是不是沒東西可以寫,想騙文章數呀?
請先不要著急,我們想做到的是當目標為1st order solid element
時,產生如往常一般的segment
;但是當目標為2nd order element
時,我們會產生細化的segment
,如此才能真正展現2nd order solid element
的效力呀。
細化的情況,可以點選下圖後,觀看影片:
今天我們先講解核心概念,[Day26]再細部討論code。
首先,假想我們手上有一個solidfacet Entity
,我們透過Entity.get_entity_values
看看裡面有些什麼資訊。
{'EID': 1,
'PID': <Entity: 0x7fcd67c80928: type: 1302(1302,N_PSOLID) id:1>,
'Name': '',
'FROZEN_ID': 'NO',
'FROZEN_DELETE': 'NO',
'FROZEN': 'NO',
'Comment': ''}
經過觀察,發現裡面並沒有Node Entity
的順序,這樣無法建立segment
。
所幸,天無絕人之路,正當我們束手無策時,想到了dir
,如果我們直接觀察Entity
本身,也就是dir(Entity)
會不會有更多資訊呢?
['__class__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'_ansaType',
'_bcomment',
'_bname',
'_cardFields',
'_comment',
'_edge_index',
'_id',
'_isDefunct',
'_name',
'_type', # Yes!
'active',
'ansa_type',
'card_fields',
'get_entity_values',
'is_usable',
'module',
'position',
'set_entity_values']
其中_type
是我們的曙光。
TETRA element
,那麼_type
會是3715
~3718
的整數。HEXA element
,那麼_type
會是3715
~3720
的整數。原來_type
就是ANSA用來儲存這個solidfacet
是solid
哪一個面的資訊。
這麼一來從_type
我們就可以取得該面的node id
及其順序。
Entity.get_entity_values
得到EID
,再進而得到Solid Entity
,再透過base.CreateShellsFromSolidFacets
得到此solid Entity
的shell Entity
。shell Entity
同時含有從_type
中萃取的node id
。這麼一來,如果是1st order solid element
,我們取到的就是一般的shell element
;但如果是2nd order solid element
,我們取到的就會是含有中點的2nd order shell element
。我們觀察2nd order shell element
的node
順序可以發現,中點的產生也是有所規律,逆時針所產生的。這麼一來,我們就可以看著node
的順序,人工寫出想要的細化segment
順序。
覺得過程有點曲折嗎?Maybe...我們也不是一拿到題目,就想到可以這麼做的,也是邊想邊試才找出方法。二次開發的過程裡,大部分時間都是折磨的,但是在磨練中我們茁壯,做出了許多大家認為無法自動化的工具,解決使用者的痛點。享受折磨的過程,痛飲找出解法的成就,或許這就是CAE二次開發工程師的浪漫吧!